#include <pthread.h>
#include <string>
#include <functional>
#include <sstream>
using namespace std;

namespace ThreadModule
{
    using func_t= function<void()>;
    int cnt= 1;

    class Thread
    {
        static void* Func(void* args)
        {
            Thread* p= (Thread*)args;
            pthread_setname_np(pthread_self(), p->_name.c_str());

            p->_task();
            return nullptr;
        }

    public:
        Thread(func_t task)//构造函数只是创建一下上层Thread结构，设置一下
        :_task(task)
        {
            stringstream ss;
            ss<<"thread "<<cnt++;
            _name= ss.str();
        }

        void Start()
        {
            pthread_create(&_t, nullptr, Func, this);
        }

        void Join()
        {
            pthread_join(_t,nullptr);
        }

    private:
        //这些数据都在Thread中，所以线程创建需要将Thread作为参数传过去
        string _name;
        pthread_t  _t;
        func_t _task;
    };
}